/**
  ******************************************************************************
  * @file    sym32l010_hal_btim.c
  * @author  AE Team
  * @version 1.0.4
  * @date    2024-06-03
  * @brief   BITM HAL module driver.
  *
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2024 SIYIMicro.
  * All rights reserved.</center></h2>
  *
  *
  ******************************************************************************
  */


/******************************************************************************/
/* Include files                                                              */
/******************************************************************************/
#include "sym32l010_hal_btim.h"


/*******************************************************************************
  * @brief  BTIM 初始化
  * @param  BTIMx     : BTIM名称
  *                     @arg SYM_BTIM1
  *                     @arg SYM_BTIM2
  *                     @arg SYM_BTIM3
  * @param  InitStruct: 初始化结构体
  * @retval None
  * @note   需通过APBEN2寄存器使能BTIMx的时钟后，才可调用该函数
  */
void HAL_BTIM_Init(BTIM_TypeDef *BTIMx, BTIM_InitTypeDef *InitStruct)
{
    BTIMx->CR1  = (uint32_t)InitStruct->OneShotEn;                    // 单次计数模式
    BTIMx->PSC  = (uint32_t)InitStruct->Prescaler;                    // 0...65535 分频系数配置
    BTIMx->ARR  = InitStruct->Reload;                                 // 溢出周期为 ARR+1
    REGBITS_MODIFY(BTIMx->SMCR,
                   BTIMx_SMCR_MSM_Msk | BTIMx_SMCR_SMS_Msk,
                  (uint32_t)InitStruct->MasterSlaveMode | (uint32_t)InitStruct->WorkMode); // 工作模式配置
    BTIMx->EGR  = BTIMx_EGR_UPDATE_Msk;
}


/*******************************************************************************
  * @brief  BTIM 反初始化
  * @param  BTIMx: BTIM名称
  *                @arg SYM_BTIM1
  *                @arg SYM_BTIM2
  *                @arg SYM_BTIM3
  * @retval None
  */
void HAL_BTIM_DeInit(BTIM_TypeDef *BTIMx)
{
    BTIMx->CR1  = 0;
    BTIMx->CR2  = 0;
    BTIMx->SMCR = 0;
    BTIMx->DIER = 0;
}


/*******************************************************************************
  * @brief  启动 BTIM
  * @param  BTIMx: BTIM名称
  *               @arg SYM_BTIM1
  *               @arg SYM_BTIM2
  *               @arg SYM_BTIM3
  * @retval None
  */
void HAL_BTIM_Start(BTIM_TypeDef *BTIMx)
{
    REGBITS_SET(BTIMx->CR1, BTIMx_CR1_EN_Msk);
}


/*******************************************************************************
  * @brief  停止 BTIM
  * @param  BTIMx: BTIM名称
  *                @arg SYM_BTIM1
  *                @arg SYM_BTIM2
  *                @arg SYM_BTIM3
  * @retval None
  */
void HAL_BTIM_Stop(BTIM_TypeDef *BTIMx)
{
    REGBITS_CLR(BTIMx->CR1, BTIMx_CR1_EN_Msk);
}


/*******************************************************************************
  * @brief  BTIM 延时 PclkCnt 个PCLK
  * @param  BTIMx  : BTIM名称
  *                  @arg SYM_BTIM1
  *                  @arg SYM_BTIM2
  *                  @arg SYM_BTIM3
  * @param  PclkCnt: 待延时的PCLK数量
  *                  34 ~ 65535
  * @note   该函数最少占用约34个PCLK时间，所以延时时间最低为34个PCLK的时间(Keil-Level1优化等级情况下)
  */
__INLINE void HAL_BTIM_DelayPclk(BTIM_TypeDef *BTIMx, uint16_t PclkCnt)
{
    if (PclkCnt < 34)
    {
        return ;
    }

    BTIMx->CR1 = 0x00;
    BTIMx->CNT = 0x00;
    BTIMx->PSC = 0x00;
    BTIMx->ARR = PclkCnt - 34;                                        // PclkCnt大于34延时更加精确
    BTIMx->CR1 = BTIMx_CR1_ONESHOT_Msk | BTIMx_CR1_EN_Msk;
    while (BTIMx->CR1 & BTIMx_CR1_EN_Msk) { ; }
}


/*******************************************************************************
  * @brief  设置BTIM的ARR值
  * @param  BTIMx    : BTIM名称
  *                    @arg SYM_BTIM1
  *                    @arg SYM_BTIM2
  *                    @arg SYM_BTIM3
  * @param  ArrValue : ARR设定值，溢出周期为 ArrValue+1
  * @retval None
  */
void HAL_BTIM_SetReloadValue(BTIM_TypeDef *BTIMx, uint16_t ArrValue)
{
    BTIMx->ARR = ArrValue;                                            // 溢出周期为 ARR+1
}


/*******************************************************************************
  * @brief  设置BTIM的CNT值
  * @param  BTIMx    : BTIM名称
  *                    @arg SYM_BTIM1
  *                    @arg SYM_BTIM2
  *                    @arg SYM_BTIM3
  * @param  CntValue : CNT设定值
  * @retval None
  */
void HAL_BTIM_SetCounterValue(BTIM_TypeDef *BTIMx, uint16_t CntValue)
{
    BTIMx->CNT = CntValue;
}


/*******************************************************************************
  * @brief  获取BTIM的的当前计数器值
  * @param  BTIMx: BTIM名称
  *                @arg SYM_BTIM1
  *                @arg SYM_BTIM2
  *                @arg SYM_BTIM3
  * @retval 当前计数值
  */
uint16_t HAL_BTIM_GetCounterValue(BTIM_TypeDef *BTIMx)
{
    return BTIMx->CNT;
}


/*******************************************************************************
  * @brief  获取BTIM的工作状态
  * @param  BTIMx: BTIM名称
  *                @arg SYM_BTIM1
  *                @arg SYM_BTIM2
  *                @arg SYM_BTIM3
  * @retval 当前定时器运行状态
  *         非0代表正在运行，0代表已经停止
  */
uint16_t HAL_BTIM_IsRunning(BTIM_TypeDef *BTIMx)
{
    return (BTIMx->CR1 & BTIMx_CR1_EN_Msk);
}


/*******************************************************************************
  * @brief  使能 BTIM 翻转输出 (TOGP / TOGN)
  * @param  BTIMx: BTIM名称
  *                 @arg SYM_BTIM1
  *                 @arg SYM_BTIM2
  *                 @arg SYM_BTIM3
  * @retval None
  */
void HAL_BTIM_TOG_Enable(BTIM_TypeDef *BTIMx)
{
    REGBITS_SET(BTIMx->CR1, BTIMx_CR1_TOGEN_Msk);
}


/*******************************************************************************
  * @brief  禁止 BTIM 翻转输出 (TOGP / TOGN)
  * @param  BTIMx: BTIM名称
  *                 @arg SYM_BTIM1
  *                 @arg SYM_BTIM2
  *                 @arg SYM_BTIM3
  * @retval None
  */
void HAL_BTIM_TOG_Disable(BTIM_TypeDef *BTIMx)
{
    REGBITS_CLR(BTIMx->CR1, BTIMx_CR1_TOGEN_Msk);
}


/*******************************************************************************
  * @brief  配置 BTIM 触发信号来源和极性
  * @param  BTIMx           : BTIM名称
  *                           @arg SYM_BTIM1
  *                           @arg SYM_BTIM2
  *                           @arg SYM_BTIM3
  * @param  TriggerSource   : 触发来源名称
  *                           @arg BTIM_TRGISRC_NONE
  *                           @arg BTIM_TRGISRC_LVD_OUT     @arg BTIM_TRGISRC_VCx_OUT
  *                           @arg BTIM_TRGISRC_SPI_NCS     @arg BTIM_TRGISRC_I2C_SCL
  *                           @arg BTIM_TRGISRC_UARTx_RXD   @arg BTIM_TRGISRC_RTC_OUT
  *                           @arg BTIM_TRGISRC_ATIM_TRGO   @arg BTIM_TRGISRC_BTIM1_TRGO
  *                           @arg BTIM_TRGISRC_BTIM2_TRGO  @arg BTIM_TRGISRC_BTIM3_TRGO
  *                           @arg BTIM_TRGISRC_GTIM1_TRGO  @arg BTIM_TRGISRC_BTIMx_ETR
  * @param  TriggerPolarity : 触发极性
  *                           @arg BTIM_TRGIPOL_POSITIVE (门控模式-高电平,  触发/计数模式-上升沿)
  *                           @arg BTIM_TRGIPOL_NEGATIVE (门控模式-低电平,  触发/计数模式-下降沿)
  * @param  TriggerFilter   : 触发滤波参数
  *                           @arg BTIM_TRGIFLT_NONE
  *                           @arg BTIM_TRGIFLT_PCLK1_N2
  *                           @arg BTIM_TRGIFLT_PCLK1_N4
  *                           @arg BTIM_TRGIFLT_PCLK1_N6
  *                           @arg BTIM_TRGIFLT_PCLK4_N4
  *                           @arg BTIM_TRGIFLT_PCLK4_N6
  *                           @arg BTIM_TRGIFLT_PCLK8_N4
  *                           @arg BTIM_TRGIFLT_PCLK8_N6
  * @retval None
  * @note   1.当设置为 BTIM_TRGISRC_VCx_OUT 时:
  *              BTIM1 的触发输入信号为 VC1_OUT
  *              BTIM2 的触发输入信号为 VC2_OUT
  *              BTIM3 无触发输入信号
  *         2.当设置为 BTIM_TRGISRC_UARTx_RXD 时:
  *              BTIM1 的触发输入信号为 UART1_RXD
  *              BTIM2 的触发输入信号为 UART2_RXD
  *              BTIM3 无触发输入信号
  *         3.当设置为 BTIM_TRGISRC_BTIMx_ETR 时:
  *              BTIM1 的触发输入信号为 BTIM1_ETR
  *              BTIM2 的触发输入信号为 BTIM2_ETR
  *              BTIM3 的触发输入信号为 BTIM3_ETR
  *         4.当TRGI信号的来源为内部单脉冲信号（溢出、比较匹配……）时需关闭滤波
  */
void HAL_BTIM_TriggerSource_Config(BTIM_TypeDef *BTIMx,
                                   BTIM_TriggerSourceTypeDef TriggerSource,
                                   BTIM_TriggerPolarityTypeDef TriggerPolarity,
                                   BTIM_TriggerFilterTypeDef TriggerFilter)
{
    REGBITS_MODIFY(BTIMx->SMCR, BTIMx_SMCR_TRGIPOL_Msk, (uint32_t)TriggerPolarity);
    REGBITS_MODIFY(BTIMx->SMCR, BTIMx_SMCR_TRGIFLT_Msk, (uint32_t)TriggerFilter);
    REGBITS_MODIFY(BTIMx->SMCR, BTIMx_SMCR_TRGISRC_Msk, (uint32_t)TriggerSource);
}


/*******************************************************************************
  * @brief  配置 BTIM 计数值清零信号来源以及极性
  * @param  BTIMx     : BTIM名称
  *                     @arg SYM_BTIM1
  *                     @arg SYM_BTIM2
  *                     @arg SYM_BTIM3
  * @param  ResetSource
  *                   : 计数值清零信号来源名称
  *                     @arg BTIM_RSTISRC_NONE       @arg BTIM_RSTISRC_I2C_LVD
  *                     @arg BTIM_RSTISRC_VCx_OUT    @arg BTIM_RSTISRC_SPI_NCS
  *                     @arg BTIM_RSTISRC_UARTx_RXD  @arg BTIM_RSTISRC_RTC_OUT
  *                     @arg BTIM_RSTISRC_ATIM_TRGO  @arg BTIM_RSTISRC_BTIM1_TRGO
  *                     @arg BTIM_RSTISRC_BTIM2_TRGO @arg BTIM_RSTISRC_BTIM3_TRGO
  *                     @arg BTIM_RSTISRC_GTIM1_TRGO @arg BTIM_RSTISRC_BTIMx_ETR
  * @param  ResetPolarity
  *                   : 计数值清零信号极性
  *                     @arg BTIM_RSTIPOL_POSITIVE
  *                     @arg BTIM_RSTIPOL_NEGATIVE
  * @retval None
  * @note   1.当设置为BTIM_RSTISRC_I2C_LVD时:
  *              BTIM1的清零信号来源为I2C1_SCL
  *              BTIM2/BTIM3的清零信号为LVD_OUT
  *         2.当设置为BTIM_RSTISRC_VCx_OUT时:
  *              BTIM1的清零信号为VC1_OUT
  *              BTIM2的清零信号为VC2_OUT
  *              BTIM3无清零信号
  *         3.当设置为BTIM_RSTISRC_UARTx_RXD时:
  *              BTIM1的清零信号为UART1_RXD
  *              BTIM2的清零信号为UART2_RXD
  *              BTIM3无清零信号
  *         3.当设置为BTIM_RSTISRC_BTIMx_ETR时:
  *              BTIM1的清零信号为BTIM1_ETR
  *              BTIM2的清零信号为BTIM2_ETR
  *              BTIM3的清零信号为BTIM3_ETR
  */
void HAL_BTIM_ResetSource_Config(BTIM_TypeDef *BTIMx,
                                 BTIM_ResetSourceTypeDef TriggerSource,
                                 BTIM_ResetPolarityTypeDef ResetPolarity)
{
    REGBITS_MODIFY(BTIMx->SMCR,
                   BTIMx_SMCR_TRGISRC_Msk | BTIMx_SMCR_RSTIPOL_Msk,
                  (uint32_t)TriggerSource | (uint32_t)ResetPolarity);
}

/*******************************************************************************
  * @brief  配置 BTIM 输出的TRGO信号
  * @param  BTIMx     : BTIM名称
  *                     @arg SYM_BTIM1
  *                     @arg SYM_BTIM2
  *                     @arg SYM_BTIM3
  * @param  TriggerOut
  *                   : TOGO源名称
  *                     @arg BTIM_TRGO_EGRUPDATE
  *                     @arg BTIM_TRGO_CREN
  *                     @arg BTIM_TRGO_UPDATE
  *                     @arg BTIM_TRGO_OV
  * @retval None
  */
void HAL_BTIM_TriggerOut_Config(BTIM_TypeDef *BTIMx, BTIM_TriggerOutTypeDef TriggerOut)
{
    REGBITS_MODIFY(BTIMx->CR2, BTIMx_CR2_MMS_Msk, (uint32_t)TriggerOut);
}


/************************ (C) COPYRIGHT SIYIMicro *****END OF FILE*************/
